package com.sheep.structure;


/**
 * 单链表
 *
 * @author wangze
 * @date 2020-10-26 10:58.
 **/
public class MySingleLinkedList<T> {


	public MySingleLinkedList() {

	}

	private int size;

	/**
	 * 第一个节点
	 */
	private Node<T> first;

	/**
	 * 默认 添加元素到单链表尾部
	 */
	public void add(T t) {
		if (this.first == null) {
			Node n = new Node(t, null);
			this.first = n;
			this.size++;
			return;
		}
		// 获取第一个节点
		Node<T> nextCode = this.first;
		// 判断是否是最后一个节点，如果不是，递归获取下一个节点
		while (nextCode.next != null) {
			nextCode = nextCode.next;
		}
		Node n = new Node(t, null);
		nextCode.next = n;
		this.size++;

	}

	/**
	 * 默认 删除单链表头部元素
	 */
	public void remove() {
		if (first == null) {
			throw new RuntimeException("链表为空");
		}
		// 获取最后一个节点
		Node<T> t = first;
		while (t.next != null) {
			t = t.next;
		}
		// 获取之前一个节点
		Node<T> prev = first;
		while (prev.next != t) {
			prev = prev.next;
		}
		// 设置为空
		prev.next=null;

		this.size--;
	}

	/**
	 * 添加元素到单链表指定索引位置，原索引节点链接为next
	 */
	public void add(T t, int index) {
		if(index<=0||index>size){
			throw new RuntimeException("索引越界");
		}
		// 设置头结点
		int nIndex=1;
		Node<T> n=this.first;
		while (true){
			if(nIndex==index){
				Node tmp=n.next;
				n.next=new Node<>(t,tmp);
				break;
			}
			n=n.next;
			nIndex++;
		}
		size++;

	}

//	/**
//	 * 删除指定的元素
//	 *
//	 * @param index
//	 * @return
//	 */
//	public T remove(int index) {
//
//	}


	@Override
	public String toString() {
		StringBuilder builder=new StringBuilder();

		Node<T> nextNode=this.first;
		while (nextNode!=null){
			builder.append(nextNode.data.toString());
			nextNode=nextNode.next;
		}
		return  builder.toString();
	}

	/**
	 * 获取元素数量
	 */
	public int size() {
		return size;
	}

	/**
	 * 静态内部类，表示为节点
	 *
	 * @param <T>
	 */
	private static class Node<T> {

		private T data;

		private Node<T> next;

		public Node(T data, Node<T> next) {
			this.data = data;
			this.next = next;
		}

	}

	public static void main(String[] args) {

		MySingleLinkedList mySingleLinkedList=new MySingleLinkedList();
		mySingleLinkedList.add(1);
		mySingleLinkedList.add(2);
		mySingleLinkedList.add(3);
		mySingleLinkedList.add(4);
		mySingleLinkedList.add(5);
		mySingleLinkedList.add(6,3);
		System.out.println(mySingleLinkedList.toString());
	;
	}
}
